﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SageKing.Aspire.ServiceDefaults.Samplers
{
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Options;
    using OpenTelemetry;
    using OpenTelemetry.Trace;
    using SageKing.Options;

    public class SignalRComponentHubFilteringSampler : Sampler
    {
        public IServiceCollection Services { get; private set; }


        public SignalRComponentHubFilteringSampler(IServiceCollection Services) : base()
        {
            this.Services = Services;
        }

        // 您可以定义其他采样器作为备选，例如始终采样或概率采样
        // private readonly Sampler _fallbackSampler = new AlwaysOnSampler(); 

        public override SamplingResult ShouldSample(in SamplingParameters samplingParameters)
        {
            var optionsMonitor = Services?.BuildServiceProvider().GetRequiredService<IOptionsMonitor<SageKingOpenTelemetryOptions>>();
            var tmpSageKingOpenTelemetryOptions = optionsMonitor?.CurrentValue;
            if (tmpSageKingOpenTelemetryOptions != null)
            {
                if (tmpSageKingOpenTelemetryOptions.HasFilterNames && tmpSageKingOpenTelemetryOptions.Trace.FilterNames.Contains(samplingParameters.Name))
                {
                    return new SamplingResult(SamplingDecision.Drop);
                }

                // 检查活动的来源名称是否与目标名称匹配
                if (samplingParameters.Tags != null && tmpSageKingOpenTelemetryOptions.HasFilterTags)
                {
                    // 注意：实际判断逻辑可能需要根据您使用的SDK和Source传递方式调整。
                    // 一种常见方式是通过ActivitySource.Name来判断，但SamplingParameters可能不直接包含它。
                    // 更可靠的方式可能是结合其他属性，或确保在创建Activity时设置了特定Tag。
                    // 这里是一个思路示例，您可能需要根据实际情况调整判断条件。
                    // rpc.service, Microsoft.AspNetCore.Components.Server.ComponentHub
                    foreach (var filter in tmpSageKingOpenTelemetryOptions.Trace.FilterTags)
                    {
                        if (samplingParameters.Tags.Where(a => filter.Contains(a)).Any())
                        {
                            return new SamplingResult(SamplingDecision.Drop);
                        }
                    }
                }
            }

            // 对于非目标Source的活动，使用备选采样策略（例如记录并采样）
            return new SamplingResult(SamplingDecision.RecordAndSample);
        }
    }
}
